/******************************************************************************/
/* @ All Rights Reserved Copyright (C) 2014 broada,Ltd.                       */
/*                                                                            */
/*  NAME      = db2_error_msg.c                                               */
/*  NOTE      = TDS 请求解析                                                  */
/*  DATE      = 2015/03/19 by zhengxd                                         */
/******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

#include "db2_param.h"
#include "db2_error_msg.h"

/*******************************************************************************
*  FUNC     :  解析RDBNFNRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_rdbnfnrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBNFNRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("RDBNFNRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("RDBNFNRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBNFNRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时sqlstate是08004 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "08004");
        /* 08004对应的error code是: -30060/-30061, 先设定为-30060 */
        p_st_resp->i_error_code = -30060;
        //p_st_resp->i_error_code = -30061;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析AGNPRMRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_agnprmrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("AGNPRMRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("AGNPRMRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
            //case DRDA_CP_RECCNT: //todo 协议中未找到定义
            case DRDA_CP_SRVLST:
                /* RDBNAM/RECCNT/SRVLST不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("AGNPRMRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("AGNPRMRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是16,32,64时sqlstate是58009 */
    if (p_st_resp->i64_svrcod == 16
        || p_st_resp->i64_svrcod == 32 || p_st_resp->i64_svrcod == 64)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 08004对应的error code是: -30020 */
        p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析CMDATHRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_cmdathrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("CMDATHRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("CMDATHRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("CMDATHRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("CMDATHRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时sqlstate是58008/58009, 现选择58008 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58008对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析BGNBNDRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_bgnbndrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("BGNBNDRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("BGNBNDRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
            case DRDA_CP_PKGNAMCT:
            case DRDA_CP_VRSNAM:
                /* RDBNAM/PKGNAMCT/VRSNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("BGNBNDRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("BGNBNDRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    /* 根据协议可知svrcod是8时sqlstate是从后续的SQLCARD取得 */
    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析CMDCHKRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_cmdchkrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("CMDCHKRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("CMDCHKRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
            //case DRDA_CP_RECCNT: //todo 协议中未找到定义
                /* RDBNAM/RECCNT不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("CMDCHKRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("CMDCHKRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /*
    * 根据协议可知svrcod是8时,sqlstate是58008 or 58009, 现选择58008
    * svrcod是8时, 16,32,64,128时sqlstate是58009
    */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58008对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    else if (p_st_resp->i64_svrcod == 16 || p_st_resp->i64_svrcod == 32
             || p_st_resp->i64_svrcod == 64 || p_st_resp->i64_svrcod == 128)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析CMDNSPRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_cmdnsprm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("CMDNSPRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("CMDNSPRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
            case DRDA_CP_CODPNT:
                /* RDBNAM/CODPNT不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("CMDNSPRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("CMDNSPRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58014 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58014");
        /* 58014对应的error code是: -30070 */
        p_st_resp->i_error_code = -30070;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析DSCINVRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_dscinvrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("DSCINVRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("DSCINVRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
            case DRDA_CP_DSCERRCD:
            case DRDA_CP_FDODSC:
            case DRDA_CP_FDODSCOFF:
            case DRDA_CP_FDOPRMOFF:
            case DRDA_CP_FDOTRPOFF:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("DSCINVRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("DSCINVRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58008 or 58009,用58008 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58008对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析DTAMCHRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_dtamchrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("DTAMCHRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("DTAMCHRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("DTAMCHRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("DTAMCHRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58008 or 58009,用58008 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58008对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析INTTKNRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_inttknrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("INTTKNRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("INTTKNRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
            case DRDA_CP_RDBINTTKN:
                /* RDBNAM/RDBINTTKN不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("INTTKNRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("INTTKNRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时, 协议没看到 */
    if (p_st_resp->i64_svrcod == 8)
    {
        //p_st_resp->i_db2_sqlstate = 1; //todo
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析MGRDEPRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_mgrdeprm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("MGRDEPRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("MGRDEPRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
            case DRDA_CP_DEPERRCD:
                /* RDBNAM/RECCNT不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("MGRDEPRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("MGRDEPRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58009 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析MGRLVLRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_mgrlvlrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("MGRDEPRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("MGRDEPRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_MGRLVLLS:
                /* MGRLVLLS不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("MGRDEPRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("MGRDEPRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58010 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58010");
        /* 58010对应的error code是: -30021 */
        p_st_resp->i_error_code = -30021;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析OBJNSPRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_objnsprm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("OBJNSPRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("OBJNSPRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            //case DRDA_CP_RECCNT: todo 协议中未定义
            case DRDA_CP_RDBNAM:
            case DRDA_CP_CODPNT:
                /* RDBNAM/RECCNT/CODPNT不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("OBJNSPRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("OBJNSPRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58015 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58015");
        /* 58015对应的error code是: -30071 */
        p_st_resp->i_error_code = -30071;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析OPNQFLRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_opnqflrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("OPNQFLRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("OPNQFLRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("OPNQFLRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("OPNQFLRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    /* 根据协议可知svrcod是8时,sqlstate从SQLCARD取 */
    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析PKGBNARM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_pkgbnarm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("PKGBNARM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("PKGBNARM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("PKGBNARM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("PKGBNARM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58012 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58012");
        /* 58012对应的error code是: -30051 */
        p_st_resp->i_error_code = -30051;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析PKGBPARM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_pkgbparm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("PKGBPARM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("PKGBPARM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("PKGBPARM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("PKGBPARM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58011 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58011");
        /* 58011对应的error code是: -30050 */
        p_st_resp->i_error_code = -30050;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析PRCCNVRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_prccnvrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("PRCCNVRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("PRCCNVRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_PRCCNVCD:
            case DRDA_CP_RDBNAM:
            //case DRDA_CP_RECCNT: todo 协议中未定义
                /* PRCCNVCD/RDBNAM/RECCNT不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("PRCCNVRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("PRCCNVRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /*
    * 根据协议可知svrcod是8时,sqlstate是58008 or 58009,现选为58008
    * svrcod是16,128时sqlstate是58009
    */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58010对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58010对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    else if (p_st_resp->i64_svrcod == 16 || p_st_resp->i64_svrcod == 128)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58010对应的error code是: -30020 */
        p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析PRMNSPRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_prmnsprm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("PRMNSPRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("PRMNSPRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_CODPNT:
            case DRDA_CP_RDBNAM:
                /* CODPNT/RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("PRMNSPRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("PRMNSPRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58016 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58016");
        /* 58016对应的error code是: -30072 */
        p_st_resp->i_error_code = -30072;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析QRYNOPRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_qrynoprm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("QRYNOPRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("QRYNOPRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
            case DRDA_CP_PKGNAMCSN:
                /* RDBNAM/PKGNAMCSN不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("QRYNOPRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("QRYNOPRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /*
    * 根据协议可知svrcod是4时,sqlstate是24501
    * svrcod是8时,sqlstate是58008 or 58009,取58008
    */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "24501");
        /* 58011对应的error code是: -501, -507, 取-501 */
        p_st_resp->i_error_code = -501;
    }
    else if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58010对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58010对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析QRYPOPRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_qrypoprm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("QRYPOPRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("QRYPOPRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
            case DRDA_CP_PKGNAMCSN:
                /* RDBNAM/RECCNT不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("QRYPOPRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("QRYPOPRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58008 or 58009 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58008对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析RDBACCRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_rdbaccrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBACCRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("RDBACCRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("RDBACCRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBACCRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58008/58009,现取58008 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58008对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析RDBNACRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_rdbnacrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBNACRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("RDBNACRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("RDBNACRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBNACRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时,sqlstate是58008 or 58009 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58008对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析RSCLMTRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_rsclmtrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RSCLMTRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("RSCLMTRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            //case DRDA_CP_CSRPOSST: todo 协议中未定义
            case DRDA_CP_DCLNAM:
            //case DRDA_CP_DRCNAM: todo  协议中未定义
            //case DRDA_CP_DTALCKST: todo  协议中未定义
            //case DRDA_CP_FILNAM: todo  协议中未定义
            case DRDA_CP_PRDID:
            case DRDA_CP_RDBNAM:
            //case DRDA_CP_RECCNT: todo   协议中未定义
            case DRDA_CP_RSCNAM:
            case DRDA_CP_RSCTYP:
            case DRDA_CP_RSNCOD:
                /* CSRPOSST/DCLNAM/DRCNAM/DTALCKST/FILNAM/PRDID/RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("RSCLMTRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RSCLMTRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /*
    * 根据协议可知svrcod是8,16时, sqlstate是57012
    * svrcod是8时, 32,64,128时sqlstate是57013
    */
    if (p_st_resp->i64_svrcod == 8 || p_st_resp->i64_svrcod == 16)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "57012");
        /* 57012对应的error code是: -30040 */
        p_st_resp->i_error_code = -30040;
    }
    else if (p_st_resp->i64_svrcod == 32
             || p_st_resp->i64_svrcod == 64 || p_st_resp->i64_svrcod == 128)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "57013");
        /* 57012对应的error code是: -30041 */
        p_st_resp->i_error_code = -30041;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析SQLERRRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_sqlerrrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBNACRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("RDBNACRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("RDBNACRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBNACRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    /* 根据协议可知svrcod是8时,sqlstate在SQLCARD中取值 */
    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析SYNTAXRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_syntaxrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("SYNTAXRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("SYNTAXRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SYNERRCD:
            case DRDA_CP_RDBNAM:
            //case DRDA_CP_RECCNT: todo
            case DRDA_CP_CODPNT:
                /* SYNERRCD/RDBNAM/RECCNT/CODPNT不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("SYNTAXRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("SYNTAXRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时, sqlstate是58008/58009, 现选58008 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58008对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析VALNSPRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_valnsprm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("SYNTAXRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("SYNTAXRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg, &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
            //case DRDA_CP_RECCNT: todo 协议中未定义
            case DRDA_CP_CODPNT:
                /* RDBNAM/RECCNT/CODPNT不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("SYNTAXRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("SYNTAXRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时, sqlstate是58017 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58017");
        /* 58017对应的error code是: -30073 */
        p_st_resp->i_error_code = -30073;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析RDBAFLRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_rdbaflrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBAFLRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("RDBAFLRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("RDBAFLRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBAFLRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    /* 根据协议可知svrcod是8时, sqlstate到SQLCARD取 */
    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析RDBATHRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_rdbathrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBATHRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("RDBATHRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("RDBATHRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("RDBATHRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时, sqlstate是08004 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "08004");
        /* 08004对应的error code是: -30060/-30061,现取-30060 */
        p_st_resp->i_error_code = -30060;
        //p_st_resp->i_error_code = -30061;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析TRGNSPRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_trgnsprm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("TRGNSPRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("TRGNSPRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* OBJNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("TRGNSPRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("TRGNSPRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时, sqlstate是58008/58009, 现选58008 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58008对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析ABNUOWRM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_abnuowrm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("ABNUOWRM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("ABNUOWRM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_RDBNAM:
                /* RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("ABNUOWRM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("ABNUOWRM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    if (p_st_resp->i_error_code)
    {
        return APM_L7_ANALYZE_SUCC;
    }
    /* 根据协议可知svrcod是8时, sqlstate是58008 or 58009,取58008 */
    if (p_st_resp->i64_svrcod == 8)
    {
        snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58008");
        /* 58008对应的error code是: -30000 */
        p_st_resp->i_error_code = -30000;
        //snprintf(p_st_resp->arr_sqlstate, sizeof(p_st_resp->arr_sqlstate), "58009");
        /* 58009对应的error code是: -30020 */
        //p_st_resp->i_error_code = -30020;
    }
    return APM_L7_ANALYZE_SUCC;
}

/*******************************************************************************
*  FUNC     :  解析ENDDTARM
*  ARGS     :  p_st_private (DB2私有数据)
*           :  i_whole_flg(packet是否完整)
*  RTN      :  APM_L7_ANALYZE_SUCC  (success)
*              APM_L7_ANALYZE_TODO  (more data)
*              APM_L7_ANALYZE_FAIL  (failed)
*  NOTE     :
*******************************************************************************/
int db2_parse_enddtarm(L7session_db2_private *p_st_private, int i_whole_flg)
{
    int i_ret = APM_L7_ANALYZE_SUCC;
    int i_param_cp = 0;
    unsigned int ui_param_bd_len = 0;
    L7_resp_db2 *p_st_resp = p_st_private->p_st_resp;
    L7session_db2 *p_st_sess = p_st_private->p_st_sess;
    L7_fragment_db2 *p_st_fragment = p_st_private->p_st_fragment;
    Frbyte_Packet *p_st_data = p_st_fragment->p_st_data;

    /* 解析参数 */
    while (p_st_fragment->ui_left_ddm_len)
    {
        i_ret = db2_get_param_hd_info(p_st_fragment, i_whole_flg
                                     , &p_st_fragment->ui_left_ddm_len
                                     , &i_param_cp, &ui_param_bd_len);
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("ENDDTARM: need more data or parse failed!\n");
            return i_ret;
        }

        switch (i_param_cp)
        {
            case DRDA_CP_SVRCOD:
                /* 根据协议SVRCOD parameter的长度是6, 即body长度是2 */
                if (ui_param_bd_len != 2)
                {
                    frdbg("ENDDTARM: parameter length is incorrect!\n");
                    return APM_L7_ANALYZE_FAIL;
                }
                i_ret = db2_get_bindr(p_st_data, 2, i_whole_flg
                                     , &p_st_resp->i64_svrcod
                                     , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_ENDREF:  //End of Progressive Reference
            case DRDA_CP_LSTCHK:  //Last chunk of data
            case DRDA_CP_RDBNAM:  //Relational Database Name
                /* RDBNAM/LSTCHK/RDBNAM不取值 */
                i_ret = db2_skip_param(p_st_data, ui_param_bd_len, i_whole_flg
                                      , &p_st_fragment->ui_left_ddm_len);
                break;

            case DRDA_CP_SRVDGN:
                /* 取得服务器诊断信息*/
                /* RDBNFNRM中有两个SRVDGN参数, 实际情况不会发生 */
                if (p_st_resp->p_error_msg)
                {
                    frfree(p_st_resp->p_error_msg);
                    p_st_resp->p_error_msg = NULL;
                }
                /* 注意: SRVDGN字段协议定义成BYTSTRDR, 实际上DB2将其当做NAMDR */
                i_ret = db2_get_chrstrdr(p_st_data, ui_param_bd_len, i_whole_flg
                                        , p_st_sess->arr_ccsid
                                        , &p_st_resp->p_error_msg
                                        , &p_st_fragment->ui_left_ddm_len);
                break;

            default:
                frdbg("ENDDTARM: Unknow parameter!\n");
                return APM_L7_ANALYZE_FAIL;
        }

        /* 判断取值正误 */
        if (i_ret != APM_L7_ANALYZE_SUCC)
        {
            frdbg("ENDDTARM: need more data or parse failed!\n");
            return i_ret;
        }
        /* 为取下一个参数做初始化准备 */
        p_st_fragment->i_param_cp = DRDA_CP_NULL;
    }

    /* 根据协议可知svrcod是8时, 表示错误 */
    p_st_fragment->i_req_resp_cp = DRDA_CP_NULL;
    return APM_L7_ANALYZE_SUCC;
}
